#include"EventloopThread.h"
#include "Eventloop.h"

EventloopThread::EventloopThread(const ThreadInitCallback &cb,
    const std::string &name)
    :loop_(nullptr)
    ,exiting_(false)
    ,thread_(std::bind(&EventloopThread::threadFunc,this),name)
    ,mutex_()
    ,cond_()
    ,callback_(cb)
    {}
EventloopThread::~EventloopThread()
{
    exiting_=true;
    if(loop_ !=nullptr)
    {
        loop_->quit();//线程退出时，将它的loop也退出掉
        thread_.join();
    }
}

Eventloop* EventloopThread::startLoop()
{
    thread_.start();//启动底层的线程

    Eventloop *loop=nullptr;

    {
        std::unique_lock<std::mutex> lock(mutex_);
        while(loop_==nullptr)
        {
            cond_.wait(lock);
        }
        loop=loop_;
    }
    return loop;
}
//下面这个方法是在单独的新线程里面运行的，因为每次调用start都会启用一个新线程
void EventloopThread::threadFunc()
{
    Eventloop loop;//创建一个独立的loop和上面的线程是一一对应的，这里才说明了one loop one thread
    if(callback_)
    {
        callback_(&loop);
    }

    {
        std::unique_lock<std::mutex> lock(mutex_);
        loop_=&loop;
        cond_.notify_one();
    }
    loop.loop();//这里相当于执行了Eventloop的loop函数，开启了底层的Poller.poll(),开始阻塞状态监听远端用户的连接
    std::unique_lock<std::mutex> lock(mutex_);
    loop_=nullptr;
}
